#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
第一编辑
第二次编辑
第三次
第四次
以伪装浏览器访问的方式解析中国软件官网敏感信息

对于一些需要登录的网站，如果不是从浏览器发出的请求，则得不到响应。
所以，我们需要将爬虫程序发出的请求伪装成浏览器正规军。
具体实现：自定义网页请求报头。
"""

import re
import urllib.request

import bs4
import requests
from bs4 import BeautifulSoup


def getHtml(url):
    # print("正在打开网页并获取....")
    page = urllib.request.urlopen(url)
    Html = str(page.read())
    print("成功获取....")
    return Html


def getImg(html):
    img_re = re.compile(r'(?<=src=")\S+?jpg')
    # img_re=re.compile(r'src="(.*?\.jpg)"')
    print("the type of html is :", type(html))
    img_list = img_re.findall(html)
    print("len(img_list)=", len(img_list))
    print("img_list[0]=", img_list[0])
    print("正在下载图片......")
    for i in range(len(img_list)):
        print("img_list[%d]=%s" % (i, img_list[i]))
        urllib.request.urlretrieve(img_list[i], 'C:\\Python\\workspace\\PythonTester\\out\\%s.jpg' % i)
    print("完成图片下载......")
    print("一共抓到了%d张图片" % len(img_list))


# 通过传入网址信息创建一个获取网页文本的函数
def getHTMLText(url):
    # 判断获取网页文本过程中是否有错误
    try:
        # 打开网址获取文本，并且把延迟设置成30s
        r = requests.get(url, timeout=30)
        # 获取状态码
        r.raise_for_status()
        # 设置文件编码
        r.encoding = r.apparent_encoding
        # 如果成功返回网页文本
        return r.text
    except:
        # 获取网页文本有错误则返回空文本
        return ""


# 通过传入空列表和网页文本信息创建一个在大学列表中加入大学信息的函数
def fillUnivList(ulist, html):
    # 用BeautifulSoup将网页文本以’html.parser‘煮成一锅粥
    soup = BeautifulSoup(html, "html.parser")
    # 通过网页源代码我们可以发现我们需要的信息都在tbody标签内，因此我们循环找出’tbody‘标签及其子标签的内容
    for tr in soup.find('tbody').children:
        # 通过bs4.element.Tag判断是否为tr标签
        if isinstance(tr, bs4.element.Tag):
            # 对于tr标签的我们拿到tr标签里的td标签
            tds = tr('td')
            # [<td>1</td>, <td><div align="left">清华大学</div></td>, <td>北京</td>, <td>95.3</td>...
            # 我们通过筛选出我们需要的td标签中的文本并将其用列表的方式加入我们传入的列表ulist中
            ulist.append([tds[0].string, tds[1].string,
                          tds[2].string, tds[3].string])


# 通过传入学校列表信息创建一个打印大学列表的函数
def printUnivList(ulist, province):
    # 打印标题
    print("中国最好大学排名2018({}地区)".center(45, '-').format(province))
    # 设置一个format格式化的模板
    # 注意：这里的{4}是因为utf8格式的英文和中文字节数不同，python会自动用英文来填
    tplt = "{0:^10}\t{1:{4}^10}\t{2:^10}\t{3:^10}"
    # 充空白位置，我们用chr(12288)将其修改成用中文填充空白位置
    # 打印第一行
    print(tplt.format("排名", "学校名称", "地区", "总分", chr(12288)))
    if province == '安徽':
        print(tplt.format(1, '安徽师范大学花津校区', '安徽', 99.9, chr(12288)))
    # 循环取出列表中的每一所大学的信息，取出的大学信息是列表的形式(可以控制range(len(ulist))的长度来控制想要打印的学校的数量)
    for i in range(len(ulist)):
        # 将每一所大学的信息以列表的形式赋值给u
        u = ulist[i]
        # u[2]是地区，判断是否为安徽地区（可以自己更改地区信息，如果删除该判断，打印所有学校信息，也可以更改判断条件）
        print(tplt.format(u[0], u[1], u[2], u[3], chr(12288)))
    # if u[2] == province:
    # 如果为安徽地区，我们打印属于安徽地区的每一所大学的信息
    #    print(tplt.format(u[0], u[1], u[2], u[3], chr(12288)))


# 定义保存函数
def save_file(data):
    path = "C:\\Python\\workspace\\PythonTester\\out\\02_douban.out"
    f = open(path, 'wb')
    f.write(data)
    f.close()


# 根据URL，获取完整的内容
def get_url_content(url):
    # 判断获取网页文本过程中是否有错误
    try:
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
                                 'Chrome/51.0.2704.63 Safari/537.36'}
        req = urllib.request.Request(url=url, headers=headers)
        res = urllib.request.urlopen(req)
        data = res.read()
        data = data.decode('utf-8')
        return data
    except:
        # 获取网页文本有错误则返回空文本
        return ""


# 根据URL，获取文章的内容
def artile_info(articleUrl):
    # 网址
    # articleUrl = "http://www.css.com.cn/industrialcase/taxadmin/authorityusers/d6c6dac1d5084bd4b8ec284addf6d3bf.html?css"

    # 打印抓取的内容
    # print(data)

    # 打印爬取网页的各类信息
    # print(type(data))
    # 刊发时间：2016-01-13
    # <h4 style="font-family:Microsoft YaHei;color:#000000;font-size:20px;font-weight:bold;font-style:normal;text-decoration:;">安全可靠内容管理系统</h4>
    # <span>刊发时间：2016-01-13&nbsp;&nbsp;</span>

    # soup = BeautifulSoup(data, "html.parser")
    # test = soup.find("刊发时间：").

    # print(test)
    # 获取文章所有内容
    articleUrl_msg = get_url_content(articleUrl)
    articleUrl_msg = str(articleUrl_msg)

    # 获取文章发表时间
    intStart = articleUrl_msg.find("刊发时间：")
    article_time = articleUrl_msg[intStart + 5:intStart + 15]

    # 获取文章标题
    intTitleStart = articleUrl_msg.find(
        "<h4 style=\"font-family:Microsoft YaHei;color:#000000;font-size:20px;font-weight:bold;font-style:normal;text-decoration:;\">")
    tmpMsg = articleUrl_msg[intTitleStart + 122:-1]
    intTitleEnd = tmpMsg.find("</h4>")

    article_title = articleUrl_msg[intTitleStart + 122:intTitleStart + 122 + intTitleEnd]
    # print(msg[intTitleStart + 125:intTitleStart + 15])

    # 关键字
    keywords = ["国家税务局", "的", "应用"]
    print("asdf")

    print("文章标题[" + article_title + "]")
    print("文章地址[" + articleUrl + "]")
    print("文章时间[" + article_time + "]")

    for keyword in keywords:
        keyword_count = word_count_in_str(articleUrl_msg, keyword)
        print(keyword + "[" + str(keyword_count) + "]")


# 统计字符串中某个词语出现的个数
def word_count_in_str(string, keyword):
    return len(string.split(keyword)) - 1


if __name__ == '__main__':
    url = "http://www.css.com.cn/industrialcase/customs/ce90ee1b9f2c4996b87dc1ca71b2af87.html?css"
    artile_info(url)
